﻿//【进阶】39.C++11(1)
//【头文件包含】
//C++的主要头文件
#include<iostream>//c++的输入输出流
using namespace std;
#include<string>
#include<vector>
#include<list>
#include<map>
#include <initializer_list>


//【命名空间】

//【类声明】
class Point
{
public:
	Point(int x = 0, int y = 0) : _x(x), _y(y)
	{
	}
private:
	int _x;
	int _y;
};
//【函数声明】
void Test1();void Test2();void Test3();


//【主函数】
int main()
{
	cout << "****主函数开始****" << endl;
	Test1();
	Test2();
	Test3();
	cout << "****主函数结束****" << endl;
	return 0;
}

//【函数定义】

/*测试用例*/void Test1()
{
	cout << "****测试用例开始****"<< endl;
	//C++11以上支持列表初始化
	vector<int> v1 = { 1,2,3,4,5,6 };
	list<int> l1 { 1,2,3,4,5,6 };
	map<string, int> m1{ {"direct",1},{"find",2},{"operator",3} };
	Point P1{ 1,2 };

	// 多个对象的列表初始化 #include <initializer_list>
	auto inlt1 = { 1,2,3,4 };
	initializer_list<int> inlt2 = { 1,2,3,4 };

	//变量类型推导
	int a = 10;
	int b = 20;
		// 用decltype推演a+b的实际类型，作为定义c的类型
	decltype(a + b) c;
	cout << typeid(c).name() << endl;

	//auto、范围for
	map<string, int> m2{ {"direct",1},{"find",2},{"operator",3},{"rise",4},{"opced",5} };
	map<string, int>::iterator it1 = m2.begin();
	//auto推导等价于it1迭代器
	auto it2 = m2.begin();
	for (const auto& a : m2)//加引用减少深拷贝，const限定只读
	{
		cout << a.first << ":" << a.second << " ";
	}
	cout << endl;

	cout << "****测试用例结束****" << endl << endl;
}

/*测试用例*/void Test2()
{
	cout << "****测试用例开始****" << endl;
	//左值引用
	int a1 = 1;
	int& b1 = a1;

	//左值引用右值：const修饰的对象
	/*错误*///int& b11 = 10;
	/*正确*/const int& b11 = 10;

	//右值引用
	int a2 = 3;
	int&& b2 = 100;
	int&& b3 = a1+a2;

	//右值引用左值:move后的左值
	/*错误*///int&& b21 = a2;
	/*正确*/int&& b21 = move(a2);

	cout << "****测试用例结束****" << endl<<endl;
}

/*测试用例*/void Test3()
{
	cout << "****测试用例开始****" << endl;
	cout << "****测试用例结束****" << endl << endl;
}


int longestPalindrome(vector<string>& words)
{
	int ret = 0;
	vector<string> w1;
	vector<string> w2;
	for (auto a : words)
	{
		if (a[0] == a[1])w1.push_back(a);
		else w2.push_back(a);
	}
	map<string, int> m1;
	for (auto a : w1)
	{
		m1[a]++;
	}
	for (auto a : m1)
	{
		a.second
	}
	// for(int i=0;i<w2.size();++i)
	// {
	//     for(int j=i)
	//     if(w2[i]1)
	// }
	return ret;
}

//【笔记】
//【进阶】39.C++11(1)
	//C++11是更新版本：
		// 重点新增的语法包括auto、范围for、新容器、线程库、【右值引用和移动语义】、【lamber表达式】
	//C++11以上支持
		//【了解】 
		// 列表初始化// 多个对象的列表初始化 #include <initializer_list>// 变量类型推导
		//【熟悉】 
		// auto、范围for（auto可以做实参、但不能做形参和返回值）
		// final与override
			// final修饰类，类变为最终类，不能被继承，修饰虚函数虚函数不能被重写
			// override是子类重写虚函数检查是否完成重写的关键字，未实现重写会报错
		// 智能指针（后面课程会讲到） 
		// 新容器：静态数组array、forward_list以及unordered系列
			//C++98 vector/string/list/dequeue/set/map/bitset + stack/queue/priotity_queue
			//C++11 静态(定长)数组array/单向链表forward_list/无序容器unordered系列
		// 显式缺省函数
			// 默认函数定义或者声明时加上=default，从而显式的指示编译器生成该函数的默认版本
			// 显示缺省后不需要再自己实现需要的默认函数，
		// 删除默认函数
			// 在类的默认成员函数声明加上=delete，该语法指示编译器不生成对应函数的默认版本
			// 删除后的函数，在对象中调用时会编译出错
			// 避免删除函数和explicit一起使用
		//【重点】
		// 右值引用（引用主要目的是给对象取别名）
			// C++98提出引用概念，支持左值引用 C++11增加支持右值引用 
			// 左值：可以修改的、通常为变量 
			// 右值：不可以被修改、通常为常量、临时对象（表达式、函数返回值）
				// 纯右值：基本类型常量或临时对象
				// 将亡值：自定义类型的临时对象
					//利用右值引用可以解决自定义类型的拷贝构造利用移动拷贝（浅拷贝）避免将亡值多余深拷贝的问题 
		// 移动语义 
	//
	//  


		









